import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Label;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

@SuppressWarnings("serial")
public class Interface extends JFrame {

	private JPanel principal; // Painel que Abrigará o do Centro e do Norte
	private Menu menu;// Top Menu.
	private ArvoreBinaria arvore_b; // Objeto Arvore Binária
	private ArvoreAVL arvore_avl; // Objeto de Arvore AVLe
	private ArvoreSplay arvore_splay; // Objeto de Arvore Splay
	private ArvoreBinaria arvoreBinaria;
	private Label error;

	// construtor da interface
	Interface() {
		// Label erro
		error = new Label("Nao é permitido inserir números maiores que 99!");

		// Aqui Ficará a tela principal
		Dimension tela = Toolkit.getDefaultToolkit().getScreenSize(); // Pega as dimensões da Tela
		setTitle("Arvores :: Inserção | Remoção"); // Título da Janela

		// PAINEL PRINCIPAL
		principal = new JPanel();
		principal.setBorder(new EmptyBorder(10, 10, 10, 10));//tamanho e estilo da borda
		principal.setLayout(new BorderLayout(5, 5)); // layout
		setContentPane(principal);
		setExtendedState(JFrame.MAXIMIZED_BOTH);
		setDefaultCloseOperation(EXIT_ON_CLOSE);

		// INPUTS E BOTÕES
		menu = new Menu();
		
		arvore_avl = new ArvoreAVL((int) tela.getWidth() - 15);
		arvore_splay = new ArvoreSplay((int) tela.getWidth() - 15);
		arvoreBinaria = new ArvoreBinaria((int) tela.getWidth() - 15);
		principal.add(arvore_splay, BorderLayout.CENTER);

		// Adiciona ação ao botão Inserir
		menu.inserir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent evt) {

				if (Integer.parseInt(menu.entrada.getText()) > 99
						|| Integer.parseInt(menu.entrada.getText()) < 0) {
					add(error, BorderLayout.SOUTH);
				} else {
					Action_Inserir(menu.arvore.getSelectedItem().toString(),
							Integer.parseInt(menu.entrada.getText()));

					menu.entrada.setText("");
				}
				arvore_splay.updateUI();
				System.out.println(arvore_avl.Altura(arvore_avl.root));
			};
		});

		// Adiciona ação ao botão Remover
		menu.remover.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				// Action_Inserir (escolhe_arvore.getSelectedItem().toString(),
				// Integer.parseInt(menu.entrada.getText()));
				if (Integer.parseInt(menu.entrada.getText()) > 99) {
					add(error, BorderLayout.SOUTH);
				} else {
					Action_Remover(menu.arvore.getSelectedItem().toString(),
							Integer.parseInt(menu.entrada.getText()));

					remove(error);
					menu.entrada.setText("");
				}
				arvore_splay.updateUI();

			};
		});

		menu.busca.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				if (Integer.parseInt(menu.entrada.getText()) > 99
						&& Integer.parseInt(menu.entrada.getText()) < 0) {
					add(error, BorderLayout.SOUTH);
				} else {
					Action_Buscar(menu.arvore.getSelectedItem().toString(),
							Integer.parseInt(menu.entrada.getText()));
					remove(error);
					menu.entrada.setText("");
				}
			};
		});

		menu.exibir.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				if (menu.arvore.getSelectedItem().toString() == "AVL") {
					principal.removeAll();
					add(menu, BorderLayout.NORTH);
					principal.add(arvore_avl, BorderLayout.CENTER);
					setTitle("Arvores :: Inserção | Remoção ---------<AVL>---------"); // Título
																						// da
																						// Janela
					principal.updateUI();
				} else if (menu.arvore.getSelectedItem().toString() == "Splay") {
					principal.removeAll();
					add(menu, BorderLayout.NORTH);
					principal.add(arvore_splay, BorderLayout.CENTER);
					setTitle("Arvores :: Inserção | Remoção ---------<Splay>---------");
					principal.add(arvore_splay.buscado, BorderLayout.SOUTH);
					principal.updateUI();
				}
			};
		});

		// Adiciona Menu
		principal.add(menu, BorderLayout.NORTH);
		setSize(1200, 800);
		setDefaultCloseOperation(EXIT_ON_CLOSE); // permite fechar a janela
	}

	public void Action_Inserir(String arvore, int numero) {

		switch (arvore) {
		case "AVL":
			principal.removeAll();
			add(menu, BorderLayout.NORTH);
			principal.add(arvore_avl, BorderLayout.CENTER);
			setTitle("Arvores :: Inserção | Remoção ---------<AVL>---------");
			arvore_avl.InserirAPartirDaRaiz(numero);
			principal.updateUI();
			break;
			
		case "Splay":
			principal.removeAll();
			add(menu, BorderLayout.CENTER);
			principal.add(arvore_splay, BorderLayout.CENTER);
			setTitle("Arvores :: Inserção | Remoção ---------<Splay>---------");
			arvore_splay.inserirAPartirDaRaiz(numero);
			principal.updateUI();
			break;
		
		case "Árvore Binária":
			principal.removeAll();
			add(menu, BorderLayout.CENTER);
			principal.add(arvore_splay, BorderLayout.CENTER);
			setTitle("Arvores :: Inserção | Remoção ---------<Árvore Binária>---------");
			arvoreBinaria.InserirAPartirDaRaiz(numero);
			principal.updateUI();
			break;
			
				

		default:
			break;
		}

	} // Action_Inserir

	public void Action_Remover(String arvore, int numero) {
		if (arvore == "AVL") {
			principal.removeAll();
			add(menu, BorderLayout.NORTH);
			principal.add(arvore_avl, BorderLayout.CENTER);
			setTitle("Arvores :: Inserção | Remoção ---------<AVL>---------");
			arvore_avl.Remover(numero);
			principal.updateUI();
		} else if (arvore == "Splay") {
			principal.removeAll();
			add(menu, BorderLayout.CENTER);
			principal.add(arvore_splay, BorderLayout.CENTER);
			arvore_splay.remover(numero);
			setTitle("Arvores :: Inserção | Remoção ---------<Splay>---------");
			principal.add(arvore_splay.buscado, BorderLayout.SOUTH);
			principal.updateUI();
		}
	} // Action_Remover

	public void Action_Buscar(String arvore, int numero) {
		if (arvore == "AVL") {
			principal.removeAll();
			add(menu, BorderLayout.NORTH);
			principal.add(arvore_avl, BorderLayout.CENTER);
			setTitle("Arvores :: Inserção | Remoção ---------<AVL>---------");
			principal.updateUI();
		} else if (arvore == "Splay") {
			principal.removeAll();
			add(menu, BorderLayout.CENTER);
			principal.add(arvore_splay, BorderLayout.CENTER);
			arvore_splay.buscaComRotacao(numero);
			setTitle("Arvores :: Inserção | Remoção ---------<Splay>---------");
			principal.add(arvore_splay.buscado, BorderLayout.SOUTH);
			principal.updateUI();
		}
	} // Action_Buscar

} // Interface
